package Web;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;


/**
 * 客户端
 * 1. 创建DatagramSocket：使用new DatagramSocket(CLIENT_PORT)创建一个DatagramSocket对象并绑定到本地指定端口（CLIENT_PORT）。
 * 2. 连接服务器：通过connect方法指定要连接的服务器的地址和端口。
 * 3. 发送和接收数据：
 *   a. 从控制台获取用户输入的数据，将其转换为字节数组后封装成DatagramPacket发送给服务器。
 *   b. 然后创建新的DatagramPacket用于接收服务器的响应，通过receive方法阻塞等待接收服务器返回的数据，并将其转换为字符串后打印出来。
 * */


public class UDPClient {
    private static final String SERVER_IP = "127.0.0.1";  // 服务器IP地址，这里假设是本地
    private static final int SERVER_PORT = 9999;  // 服务器端口号
    private static final int CLIENT_PORT = 12345;  // 客户端自身使用的端口号

    public static void main(String[] args) {
        // 使用new DatagramSocket(CLIENT_PORT)创建一个DatagramSocket对象并绑定到本地指定端口
        try (DatagramSocket clientSocket = new DatagramSocket(CLIENT_PORT)) {
            // 连接到服务器，通过connect方法指定服务器的地址和端口
            clientSocket.connect(InetAddress.getByName(SERVER_IP), SERVER_PORT);
            System.out.println("UDP客户端已启动，连接到服务器 " + SERVER_IP + ":" + SERVER_PORT);

            Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.print("请输入要发送的数据（输入exit退出）: ");
                String input = scanner.nextLine();
                if ("exit".equalsIgnoreCase(input)) {
                    break;
                }

                // 将输入的数据转换为字节数组
                byte[] sendData = input.getBytes();
                // 创建DatagramPacket对象用于发送数据，指定数据、数据长度
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length);
                // 调用send方法发送数据
                clientSocket.send(sendPacket);

                // 创建字节数组缓冲区用于接收服务器的响应
                byte[] receiveBuffer = new byte[1024];
                // 创建DatagramPacket对象用于接收数据，指定缓冲区和缓冲区大小
                DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
                // 调用receive方法接收服务器的响应，该方法会阻塞直到接收到数据
                clientSocket.receive(receivePacket);

                // 将接收到的字节数组转换为字符串
                String receivedResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("服务器响应: " + receivedResponse);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
